package com.levy.utils.FileTool;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
 * FileDirectory类用于查找指定根目录下的所有文件和目录 可以通过正则表达式对要查找的 文件及目录进行筛
 * Created by 郭利伟 on 2017.08.22.
 */
public class SearchFileUtils {

    // 存放文件
    private List<File> fileList = new ArrayList<File>();
    // 存放目录
    private List<File> directoryList = new ArrayList<File>();
    // 存放文件和目录
    private List<File> list = new ArrayList<File>();
    private File file;// 目录
    private String regex;// 正则表达式

    public SearchFileUtils(String path) {
        file = new File(path);
        this.regex = ".*";
    }

    public SearchFileUtils(File file) {
        this.file = file;
        this.regex = ".*";
    }

    public SearchFileUtils(String path, String regex) {
        file = new File(path);
        this.regex = regex;
    }

    public SearchFileUtils(File file, String regex) {
        this.file = file;
        this.regex = regex;
    }

    // 返回当前目录下的所有文件及子目录
    public List<File> files() {
        File[] files = file.listFiles();
        List<File> list = new ArrayList<File>();
        for (File f : files)
            if (f.getName().matches(regex))
                list.add(f);
        return list;
    }

    // 返回该根目录下的所有文件
    public List<File> allFiles() {
        if (list.isEmpty())
            search(file);
        return fileList;
    }

    // 返回该根目录下的所有子目录
    public List<File> allDirectory() {
        if (list.isEmpty())
            search(file);
        return directoryList;
    }

    // 返回该根目录下的所有文件及子目录
    public List<File> allFilesAndDirectory() {
        if (list.isEmpty())
            search(file);
        return list;
    }

    // 递归搜索当前目录下的所有文件及目录
    private void search(File file) {
        File[] files = file.listFiles();
        if (files == null || files.length == 0)
            return;
        for (File f : files) {
            if (f.getName().matches(regex))
                list.add(f);
            if (f.isFile() && f.getName().matches(regex))
                fileList.add(f);
            else {
                if (f.getName().matches(regex))
                    directoryList.add(f);
                search(f);
            }
        }
    }

    public static void main(String[] args) {
        System.out.println("-------- 指定目录中所有文件及子目录-------");
        List<File> list = (List<File>) new SearchFileUtils(
                "C:\\Users\\liwei\\Desktop\\to_liwei\\to_liwei").files();
        for (File file : list)
            System.out.println(file.getName());
//        System.out.println("--------指定目录中以txt为后缀的文件------");
//        list = (List<File>) new SearchFileUtils("F:/赞美诗--挑选后",
//                ".*\\.txt").files();
//        for (File file : list)
//            System.out.println(file.getName());
//        System.out.println("--------以该目录为根目录的所有文件及子目录--");
//        list = (List<File>) new SearchFileUtils("F:/赞美诗--挑选后")
//                .allFilesAndDirectory();
//        for (File file : list)
//            System.out.println(file.getName());
    }
}
